package cn.iune.erp.accounting;

import java.sql.Date;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.justep.baas.data.Row;
import com.justep.baas.data.RowState;
import com.justep.baas.data.Table;
import com.justep.baas.data.Transform;


@Transactional
@Service
public class AccountPeriodServiceImpl implements IAccountPeriodService {

	@Autowired
	private IAccountPeriodDao dao;
	
	
	
	@Transactional
	@Override
	public JSONObject save(JSONObject object) throws ParseException {
		//Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚。 
		//如果一个方法抛出Exception或者Checked异常，Spring事务管理默认不进行回滚。 
		// JSON转换Table
		System.out.println("AccountPeriodServiceImpl.save-->>"+object.toJSONString());
		Table table= Transform.jsonToTable(object);
		
		JSONObject data = new JSONObject();
		data.put("concept", table.getTableName());
		JSONArray rows = new JSONArray();
		List<String> idsNew = new ArrayList<String>();
		List<String> idsDel = new ArrayList<String>();
				
		List<Row> list = table.getRows();
		for(Row row : list){
			JSONObject javaObject= Transform.rowToJavaObject(table, row);
			AccountPeriod obj = JSON.toJavaObject(javaObject, AccountPeriod.class);
			if(RowState.NEW.equals(obj.getRowState())){
				dao.insert(obj);
				idsNew.add(obj.getfID());
			}
			if(RowState.DELETE.equals(obj.getRowState())){
				dao.delete(obj.getfID());
				idsDel.add(obj.getfID());
			}
			if(RowState.EDIT.equals(obj.getRowState())){
				AccountPeriod objNew = dao.update(obj);
				//返回+1后的version到前台BizData中进行刷新，使得前台的version与后台的一致。
				///////////////////////////////////////////////////////////////////////
				JSONObject jsonRow = new JSONObject();
				jsonRow.put("id", obj.getfID());
				jsonRow.put("version", objNew.getVersion());
				rows.add(jsonRow);
				//////////////////////////////////////////////////////////////////////
			}
			//测试使用
			/*
			 * 测试结果表明，如果要更新的java对象与数据库中的数据一致，那么merge函数
			 * 被调用之后返回的version和被调用之前的version是相同的，即使merge之后
			 * 使用了flush（）函数也是一样的效果。
			 */
			/*
			if(RowState.NONE.equals(obj.getRowState())){
				AccountPeriod objNew = dao.update(obj);
				//返回+1后的version到前台BizData中进行刷新，使得前台的version与后台的一致。
				///////////////////////////////////////////////////////////////////////
				AccountPeriod objQuery = dao.getByID(obj.getfID());
				log.info("update更新后flush（）之后查询出objQuery.getVersion()-->>"+objQuery.getVersion());
				JSONObject jsonRow = new JSONObject();
				jsonRow.put("id", obj.getfID());
				jsonRow.put("version", objQuery.getVersion());
				rows.add(jsonRow);
				//////////////////////////////////////////////////////////////////////
			}
			*/
		}
		
		data.put("rows", rows);
		data.put("idsNew", idsNew);
		data.put("idsDel", idsDel);
		
		return data;
	}
	
	@Override
	public AccountPeriod getByNo(String yearNo, String periodNo, String enterpriseNo) {
		return dao.getByNo(yearNo, periodNo, enterpriseNo);
	}
	
	@Override
	public AccountPeriod getByDate(Date orderDate, String enterpriseNo) {
		return dao.getByDate(orderDate, enterpriseNo);
	}

	@Override
	public List<AccountPeriod> getByMasterID(String fMasterID) {
		return dao.getByMasterID(fMasterID);
	}
	
	
	
	@Transactional
	@Override
	public int confirm(String fID) {
		AccountPeriod a = dao.getByID(fID);
		a.setState("confirm");
		dao.update(a);
		return 0;
	}
	
	@Transactional
	@Override
	public int active(String fID) {
		AccountPeriod a = dao.getByID(fID);
		a.setState("active");
		dao.update(a);
		return 0;
	}
	
	@Transactional
	@Override
	public int confirm(AccountPeriod a) {
		a.setState("confirm");
		dao.update(a);
		return 0;
	}
	
	@Transactional
	@Override
	public int active(AccountPeriod a) {
		a.setState("active");
		dao.update(a);
		return 0;
	}

	@Transactional
	@Override
	public int confirmByMasterID(String fMasterID){
		List<AccountPeriod> as = dao.getByMasterID(fMasterID);
		for(AccountPeriod a:as){
			this.confirm(a);
		}
		return 0;
	}
	
	@Transactional
	@Override
	public int activeByMasterID(String fMasterID){
		List<AccountPeriod> as = dao.getByMasterID(fMasterID);
		for(AccountPeriod a:as){
			this.active(a);
		}
		return 0;
	}
	
	//获取下一个期间
	@Override
	public String getYearPeriodNext(String yearNo, String periodNo, String enterpriseNo){
		//(1)、首先获取下一个期间
		int iYearNo=Integer.parseInt(yearNo);
		int iMonthNo=Integer.parseInt(periodNo);
		if (iMonthNo==12){
			iYearNo++;
			iMonthNo=1;
		}else{
			iMonthNo++;
		}
		String yearPeriodNext=Integer.toString(iYearNo)+"-"+String.format("%02d", iMonthNo);
		
		AccountPeriod obj = dao.getByNo(yearNo, periodNo, enterpriseNo);
		if(obj==null) {
			return null;
		}
		
		return yearPeriodNext;
	}
	
	//获取下一个期间
	@Override
	public String getYearPeriodNext(String yearPeriod, String enterpriseNo){
		//(1)、首先获取下一个期间
		String yearNo = yearPeriod.split("-")[0];
		String periodNo = yearPeriod.split("-")[1];
		return this.getYearPeriodNext(yearNo, periodNo, enterpriseNo);
	}

	//获取上一个期间
	@Override
	public String getYearPeriodPrior(String yearNo, String periodNo, String enterpriseNo){
		//(1)、首先获取上一个期间
		int iYearNo=Integer.parseInt(yearNo);
		int iMonthNo=Integer.parseInt(periodNo);
		if (iMonthNo==1){
			iYearNo--;
			iMonthNo=12;
		}else{
			iMonthNo--;
		}
		
		String yearPeriodPrior = Integer.toString(iYearNo)+"-"+String.format("%02d", iMonthNo);
		
		AccountPeriod obj = dao.getByNo(yearNo, periodNo, enterpriseNo);
		if(obj==null) {
			return null;
		}
		
		return yearPeriodPrior;
	}
	
	//获取上一个期间
	@Override
	public String getYearPeriodPrior(String yearPeriod, String enterpriseNo){
		//(1)、首先获取下一个期间
		String yearNo = yearPeriod.split("-")[0];
		String periodNo = yearPeriod.split("-")[1];
		return this.getYearPeriodPrior(yearNo, periodNo, enterpriseNo);
	}
	
	//获取会计期间列表
	@Override
	public List<String> getPeriodNoList(String yearNo, String periodNoStart, String periodNoEnd, String enterpriseNo){
		List<AccountPeriod> objs = dao.getPeriodNoList(yearNo, periodNoStart, periodNoEnd, enterpriseNo);
		List<String> ids = new ArrayList<String>();
		for(AccountPeriod obj : objs){
			ids.add(obj.getfID());
		}
		return ids;
	}

	
}
